// ignore_for_file: dangling_library_doc_comments, slash_for_doc_comments

/*** 
 * @Author: Zhong
 * @Date: 2025-03-26 16:24:33
 * @LastEditors: Zhong zhongxiaodong@eenet.com
 * @LastEditTime: 2025-07-15 10:41:52
 * @FilePath: /wan_android_flutter/lib/common_code/extension/string_extension.dart
 * @Description: String类的扩展
 */

import 'dart:convert';

extension StringExtension on String {
  // 判断字符串是否为空
  bool get isNullOrEmpty {
    return this.isEmpty;
  }

  // 判断字符串是否不为空
  bool get isNotNullOrEmpty {
    return !isNullOrEmpty;
  }

  // 去除字符串首尾的空白字符
  String get trimmed {
    return this.trim();
  }

  // 将字符串转换为整数，如果转换失败则返回 null
  int? toIntOrNull() {
    return int.tryParse(this);
  }

  // 将字符串转换为双精度浮点数，如果转换失败则返回 null
  double? toDoubleOrNull() {
    return double.tryParse(this);
  }

  // 判断字符串是否为有效的电子邮件地址
  bool get isValidEmail {
    final emailRegex = RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$');
    return emailRegex.hasMatch(this);
  }

  // 判断字符串是否为有效的手机号码（简单示例，仅支持 11 位数字）
  bool get isValidPhoneNumber {
    final phoneRegex = RegExp(r'^\d{11}$');
    return phoneRegex.hasMatch(this);
  }

  // 截取字符串的前 n 个字符
  String take(int n) {
    return this.length <= n ? this : this.substring(0, n);
  }

  // 截取字符串的后 n 个字符
  String takeLast(int n) {
    return this.length <= n ? this : this.substring(this.length - n);
  }

  // 重复字符串指定次数
  String repeat(int count) {
    return List.filled(count, this).join();
  }

  // 字符串首字母大写
  String get capitalize {
    if (isNullOrEmpty) return this;
    return '${this[0].toUpperCase()}${substring(1)}';
  }

  // 字符串全部字母大写
  String get toUpperCaseAll {
    return this.toUpperCase();
  }

  // 字符串全部字母小写
  String get toLowerCaseAll {
    return this.toLowerCase();
  }

  // 反转字符串
  String get reversed {
    return String.fromCharCodes(runes.toList().reversed);
  }

  // 判断字符串是否只包含数字
  bool get isNumeric {
    return double.tryParse(this) != null;
  }

  // 判断字符串是否只包含字母
  bool get isAlphabetic {
    return RegExp(r'^[a-zA-Z]+$').hasMatch(this);
  }

  // 判断字符串是否只包含字母和数字
  bool get isAlphanumeric {
    return RegExp(r'^[a-zA-Z0-9]+$').hasMatch(this);
  }

  // 去除字符串中的所有空格
  String get removeAllSpaces {
    return this.replaceAll(' ', '');
  }

  // 对字符串进行 HTML 实体编码
  String get htmlEncode {
    return HtmlEscape().convert(this);
  }

  // 检查字符串是否以某个子字符串结尾，忽略大小写
  bool endsWithIgnoreCase(String suffix) {
    return toLowerCase().endsWith(suffix.toLowerCase());
  }

  // 检查字符串是否以某个子字符串开头，忽略大小写
  bool startsWithIgnoreCase(String prefix) {
    return toLowerCase().startsWith(prefix.toLowerCase());
  }

  // 替换字符串中所有匹配的子字符串，忽略大小写
  String replaceAllIgnoreCase(String from, String to) {
    final pattern = RegExp(from, caseSensitive: false);
    return replaceAll(pattern, to);
  }
}
